package works.cirno.mocha;
import org.junit.Assert;
import org.junit.Test;
import works.cirno.mocha.InvokeContext;
import works.cirno.mocha.resolver.InvokeTargetResolver;
import works.cirno.mocha.resolver.PrefixDictInvokeTargetResolver;
import works.cirno.mocha.resolver.RegexInvokeTargetResolver;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.Collection;
import java.util.Properties;
import java.util.concurrent.ThreadLocalRandom;
/**
*
*/
public class InvokeTargetResolverTest {
private long doBenchmark(InvokeTargetResolver resolver, Collection<String> keys) {
long ret = 0;
long begin = System.nanoTime();
for (String key : keys) {
int hash = resolver.resolve(key, "GET").hashCode();
ret += hash;
}
long dur = System.nanoTime() - begin;
if (ThreadLocalRandom.current().nextInt(100000) == 1) {
System.out.println("Please ignore: " + ret);
}
return dur;
}
public void doTest(InvokeTargetResolver resolver) {
try (BufferedReader br = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/uris.list"), Charset.forName("utf-8")))) {
String line;
while ((line = br.readLine()) != null) {
line = line.trim();
if (line.length() > 0) {
resolver.addServe(line, "GET", new MockInvokeTarget(line));
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
Properties p = new Properties();
try (InputStream testIs = getClass().getResourceAsStream("/uritest.properties")) {
p.load(testIs);
} catch (IOException e) {
throw new RuntimeException(e);
}
for (String key : p.stringPropertyNames()) {
InvokeContext ctx = resolver.resolve(key, "GET");
MockInvokeTarget target = (MockInvokeTarget) ctx.getTarget();
String[] expected = p.getProperty(key).split(",");
Assert.assertEquals(target.getTestData(), expected[0]);
if (expected.length == 1) {
// Assert.assertNull(ctx.getUriMatcher());
} else {
for (int i = 1, max = expected.length; i < max; i++) {
int idx = expected[i].indexOf('=');
if (idx < 0) {
throw new IllegalArgumentException("Illegal test descriptor line: " + key + "=" + p.getProperty(key));
}
String ek = expected[i].substring(0, idx);
String ev = expected[i].substring(idx + 1);
Assert.assertEquals(ev, ctx.getUriMatcher().group(ek));
}
}
}
long total = 0;
for (int i = 0; i < 50; i++) {
long dur = doBenchmark(resolver, p.stringPropertyNames());
if (i > 39) {
total += dur;
}
}
System.out.println(resolver.getClass().getName() + ": " + (p.stringPropertyNames().size() * 20) + " / " + p.stringPropertyNames().size() + " uris resolved in " + (total / 1000000.0) + "ms");
}
@Test
public void testRegexInvokeTargetResolver() {
doTest(new RegexInvokeTargetResolver());
}
@Test
public void testPrefixedInvokeTargetResolver() {
doTest(new PrefixDictInvokeTargetResolver());
}
}